import { isRef } from './reactive'
import { isFunction, isArray, isPlainObject } from './utils'

/** 
 * 生成一个执行所有方法的函数
 * @return {Function} 返回一个执行所有方法的函数
 */
export function wrapFuns(...args: Function[]) {
	return function (...params: any[]) {
		return args.map((fun) => {
			try {
				fun && fun.apply(this, params)
			} catch (e) {
				console.error(e);
				/** ignore */
			}
		})
	}
}

/** 
 * 生成私有属性名
 * @return {String} 返回一个私有属性名
 */
export const createPrivateName = (name: string): string => `__${name}__`

/** 
 * 值的获取（reactive/ref内容的获取）
 * @return {Object} 返回一个原生对象
 */
export const deepToRaw = function (...args: any[]) {
	return deepCopy((function (x: unknown) {
		if (isFunction(x)) {
			return null
		}
		if (isRef(x)) {
			return x.value
		}
		if (isArray(x)) {
			return x.map((item) => deepToRaw(item))
		}
		if (isPlainObject(x)) {
			const obj: { [key: string]: unknown } = {}
			Object.keys(x).forEach((key) => {
				obj[key] = deepToRaw(x[key])
			})
			return obj
		}
		return x
	}).apply(this, args))
}

/** 
 * 深度拷贝
 * @return {Object} 返回一个原生对象
 */
function deepCopy(params) {
	var obj;
	if (typeof params === 'object') {
		if (Array.isArray(params)) {
			obj = [];
			for (var i = 0; i < params.length; i++) {
				obj.push(deepCopy(params[i]))
			}
		} else {
			obj = {};
			for (var c in params) {
				obj[c] = deepCopy(params[c]);
			}
		}
	} else { return params; }
	return obj;
}